//>>built
define("dojox/grid/enhanced/plugins/Search", ["dojo/_base/kernel", "dojo/_base/lang", "dojo/_base/declare", "dojo/_base/array", "dojo/data/util/filter", "../../EnhancedGrid", "../_Plugin"], function (_1, _2, _3, _4, _5, _6, _7) {
    var _8 = _3("dojox.grid.enhanced.plugins.Search", _7, {name: "search", constructor: function (_9, _a) {
        this.grid = _9;
        _a = (_a && _2.isObject(_a)) ? _a : {};
        this._cacheSize = _a.cacheSize || -1;
        _9.searchRow = _2.hitch(this, "searchRow");
    }, searchRow                                               : function (_b, _c) {
        if (!_2.isFunction(_c)) {
            return;
        }
        if (_2.isString(_b)) {
            _b = _5.patternToRegExp(_b);
        }
        var _d = false;
        if (_b instanceof RegExp) {
            _d = true;
        } else {
            if (_2.isObject(_b)) {
                var _e = true;
                for (var _f in _b) {
                    if (_2.isString(_b[_f])) {
                        _b[_f] = _5.patternToRegExp(_b[_f]);
                    }
                    _e = false;
                }
                if (_e) {
                    return;
                }
            } else {
                return;
            }
        }
        this._search(_b, 0, _c, _d);
    }, _search                                                 : function (_10, _11, _12, _13) {
        var _14 = this, cnt = this._cacheSize, _15 = {start: _11, query: this.grid.query, sort: this.grid.getSortProps(), queryOptions: this.grid.queryOptions, onBegin: function (_16) {
            _14._storeSize = _16;
        }, onComplete                                      : function (_17) {
            if (!_4.some(_17, function (_18, i) {
                if (_14._checkRow(_18, _10, _13)) {
                    _12(_11 + i, _18);
                    return true;
                }
                return false;
            })) {
                if (cnt > 0 && _11 + cnt < _14._storeSize) {
                    _14._search(_10, _11 + cnt, _12, _13);
                } else {
                    _12(-1, null);
                }
            }
        }};
        if (cnt > 0) {
            _15.count = cnt;
        }
        this.grid._storeLayerFetch(_15);
    }, _checkRow                                               : function (_19, _1a, _1b) {
        var g = this.grid, s = g.store, i, _1c, _1d = _4.filter(g.layout.cells, function (_1e) {
            return !_1e.hidden;
        });
        if (_1b) {
            return _4.some(_1d, function (_1f) {
                try {
                    if (_1f.field) {
                        return String(s.getValue(_19, _1f.field)).search(_1a) >= 0;
                    }
                } catch (e) {
                }
                return false;
            });
        } else {
            for (_1c in _1a) {
                if (_1a[_1c] instanceof RegExp) {
                    for (i = _1d.length - 1; i >= 0; --i) {
                        if (_1d[i].field == _1c) {
                            try {
                                if (String(s.getValue(_19, _1c)).search(_1a[_1c]) < 0) {
                                    return false;
                                }
                                break;
                            } catch (e) {
                                return false;
                            }
                        }
                    }
                    if (i < 0) {
                        return false;
                    }
                }
            }
            return true;
        }
    }});
    _6.registerPlugin(_8);
    return _8;
});
